package org.moonlight.jvm.classfile.constant.info.dynamic;

import org.moonlight.jvm.classfile.ClassReader;
import org.moonlight.jvm.classfile.constant.ConstantInfo;

/**
 * CONSTANT_MethodType_info 结构表示
 *   invokedynamic指令所用到的引导方法(bootstrap method)
 *   引导方法所用到的动态调用名称(dynamic invocation name)
 *   参数和返回类型
 *   并可以给引导方法传入一系列称为静态参数(static argument)的常量。
 * 其结构如下:
 *   CONSTANT_InvokeDynamic_info {
 *       u1 tag
 *       u2 bootstrap_method_attr_index // bootstrap_method_attr_index项的值必须是对当前class文件中引导方法表的bootstrap_methods数组的有效索引
 *       u2 name_and_type_index // name_and_type_index项的值必须是对常量池表的有效索引，常量池表在该索引处的成员必须是CONSTANT_NameAndType_info结构
 *   }
 *
 * CONSTANT_MethodType_info、CONSTANT_MethodHandle_info、CONSTANT_InvokeDynamic_info
 * 它们是Java SE7才添加到class文件中的，目的是支持新增的 invokedynamic 指令。
 *
 * @author Moonlight
 * @createTime 2023/8/15 15:30
 **/
public class ConstantInvokeDynamicInfo implements ConstantInfo {

    private int bootstrapMethodAttrIdx;
    private int nameAndTypeIdx;

    @Override
    public void readInfo(ClassReader reader) {
        this.bootstrapMethodAttrIdx = reader.readUint16();
        this.nameAndTypeIdx = reader.readUint16();
    }

    @Override
    public int tag() {
        return 0;
    }
}
